﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Acoris.OpenGL
{

    using OpenTK;
    using OpenTK.Graphics;
    using OpenTK.Graphics.OpenGL;
    using System.Runtime.InteropServices;

    public partial class MainWindow : GameWindow
    {

        public MainWindow() {
            this.RenderFrame += MainWindow_RenderFrame;
        }

        private void MainWindow_RenderFrame(object sender, FrameEventArgs e) {
            /// 1.控件OnCreate方法中
            // 设置清屏色
            GL.ClearColor(Color.SkyBlue);  // 设置清屏色
                                           /// 2. Resize方法中
            // 1. 设置视口
            GL.Viewport(0, 0, ClientSize.Width, ClientSize.Height);

            // 2. 操纵投影矩阵，设置平截头体（比例通常和视口比例相同，否则输出画面会走样）
            //矩阵模式,投影矩阵,openGL基于状态机
            GL.MatrixMode(MatrixMode.Projection);

            // 加载单位矩阵，重置矩阵的状态
            GL.LoadIdentity();

            // 设置平截头体（视景体）
            GL.Frustum(-0, 0, -1.0f, 1.0f, 3.0f, 7.0f); // 创建平截头体
                                                                              // 另外一种方法
                                                                              //Matrix4 perpective  = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4,aspect_ratio,1.0f,100.0f);
                                                                              //GL.LoadMatrix(ref perpective);

            /// 3. Paint或者DrawFrame()方法中
            // 清除颜色缓冲区
            GL.Clear(ClearBufferMask.ColorBufferBit);

            // 操纵模型视图矩阵,设置眼球参数
            GL.MatrixMode(MatrixMode.Modelview);
            GL.LoadIdentity();

            // 设置观察者参数
            Matrix4 mx4 = Matrix4.LookAt(0f, 0f, 5f, 0f, 0f, 0f, 0f, 1f, 0f);
            GL.MatrixMode(MatrixMode.Modelview);
            GL.LoadMatrix(ref mx4);
            // 绘制图形
            GL.Begin(BeginMode.Polygon);
            GL.Vertex3(-1.0f, -1.0f, 2.0f);
            GL.Vertex3(1.0f, -1.0f, 2.0f);
            GL.Vertex3(1.0f, 1.0f, 2.0f);
            GL.Vertex3(-1.0f, 1.0f, 2.0f);
            GL.End();

            // 交换缓冲区
            SwapBuffers();
        }
    }

}
